/*
 * Vent_RegAbonos.java
 *
 * Created on 15 de agosto de 2008, 03:04 PM
 */

package administrador;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author  daniel1
 */
public class Vent_RegAbonos extends javax.swing.JFrame {
Conexion conexion;
String cod_cliente;
String fecha;
String hora;
int cod_Cuenta=0;
Vent_CuentasCobrar vent_CC;
Vent_CuentasPagar vent_CP;
Usuario user;
String bandera;
    /** Creates new form Vent_RegAbonos */
    public Vent_RegAbonos(Conexion cEnt,String cod_cliente,Vent_CuentasCobrar vEnt,Usuario user) {
        this.user=user;
        vent_CC=vEnt;
        this.conexion=cEnt;
        this.cod_cliente=cod_cliente;
        initComponents();
        setBounds(100,100,549,300);
        setVisible(true);
        refrescar(); 
        bandera="xCobrar";
        seleccionarCombo();
    }
    
     public Vent_RegAbonos(Conexion cEnt,String cod_cliente,Vent_CuentasPagar vEnt,Usuario user) {
        this.user=user;
        vent_CP=vEnt;
        this.conexion=cEnt;
        this.cod_cliente=cod_cliente;
        initComponents();
        setBounds(100,100,549,300);
        setVisible(true);
       refrescar(); 
        
        bandera="xPagar";
        seleccionarCombo();
    }
    
    public void seleccionarCombo() {
    
    try{
        
        if (bandera.equals("xCobrar")) {
            int seleccion=vent_CC.tabla.getSelectedRow();
            String codigo=vent_CC.tabla.getValueAt(seleccion,0).toString();
            //Selecciono la opcion en el combobox
            int numero=cb_factura.getItemCount();
            for(int i=0;i<numero;i++){
               String etiqueta=cb_factura.getItemAt(i).toString().substring(0,2);
               System.out.println("Compara="+codigo.replaceAll(" ","")+"|"+etiqueta.replaceAll(" ",""));
               if(codigo.replaceAll(" ","").equals(etiqueta.replaceAll(" ",""))){
               cb_factura.setSelectedIndex(i);    
               break;
               
               }
               
            }
            
           
            
        }
         if (bandera.equals("xPagar")) {
            int seleccion=vent_CP.tabla.getSelectedRow();
            String codigo=vent_CP.tabla.getValueAt(seleccion,0).toString();
            //Selecciono la opcion en el combobox
            int numero=cb_factura.getItemCount();
            for(int i=0;i<numero;i++){
                
               String[] datos=cb_factura.getItemAt(i).toString().split(" ");
               String etiqueta=datos[0];
               //String etiqueta=cb_factura.getItemAt(i).toString().substring(0,2);
               System.out.println("Compara="+codigo.replaceAll(" ","")+"|"+etiqueta.replaceAll(" ",""));
               if(codigo.replaceAll(" ","").equals(etiqueta.replaceAll(" ",""))){
               cb_factura.setSelectedIndex(i);    
               break;
               
               }
               
            }
         }

    }catch(Exception e){
    System.err.println("No se selecciono en la ventana de deudas una deuda, se cargan todas");
    }
    }
    
    
    
    public void refrescar(){
        
        llenarFacturas();
        fecha=new java.sql.Date(System.currentTimeMillis()).toString();
        hora=new java.sql.Time(System.currentTimeMillis()).toString();
        txt_hora.setText(hora);
        txt_fecha.setText(fecha);
        txt_resp.setText(user.nombre);
       
    }

    public void llenarFacturas(){
        //limpio camposlbl
        cb_factura.removeAllItems();
        txt_fecha.setText("");
        txt_hora.setText("");
        txt_valor.setText("");
        txt_resp.setText("");
        
       //Encuentro las factura y valores del cliente:
            ResultSet resp = conexion.consultarBase("SELECT cod_cuentasCobrar,cod_factura,fecha,valor FROM cuentaspendientes c where cod_cliente like '" + cod_cliente + "';");
            String NumFact="";
            String NumCuent="";
            double valor=0;
            Date fecha;
        try {
            resp.beforeFirst();
            while (resp.next()) {
                NumCuent=resp.getString("cod_cuentasCobrar");
                NumFact=resp.getString("cod_factura");
                valor=resp.getDouble("valor");
                fecha=resp.getDate("fecha");
                
                String etiqueta=NumCuent+"  "+NumFact+" "+fecha+" "+valor;
                //LLeno el Combo de Facturassplit
                cb_factura.addItem(etiqueta);
                
            }
            //cb_factura.
        } catch (SQLException ex) {
            Logger.getLogger(Vent_RegAbonos.class.getName()).log(Level.SEVERE, null, ex);
        }
    //cb_factura.
        
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        cb_factura = new javax.swing.JComboBox();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jPanel2 = new javax.swing.JPanel();
        jLabel4 = new javax.swing.JLabel();
        lbl_saldo = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        lbl_valor = new javax.swing.JLabel();
        bt_registrar = new javax.swing.JButton();
        txt_resp = new javax.swing.JTextField();
        jLabel8 = new javax.swing.JLabel();
        txt_fecha = new javax.swing.JTextField();
        txt_hora = new javax.swing.JTextField();
        jLabel5 = new javax.swing.JLabel();
        txt_valor = new javax.swing.JTextField();
        txt_clave = new javax.swing.JPasswordField();
        jLabel7 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Registro de Abono", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 14), new java.awt.Color(0, 153, 0))); // NOI18N
        jPanel1.setLayout(null);

        cb_factura.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cb_facturaItemStateChanged(evt);
            }
        });
        cb_factura.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cb_facturaActionPerformed(evt);
            }
        });
        jPanel1.add(cb_factura);
        cb_factura.setBounds(100, 30, 220, 20);

        jLabel1.setText("Factura:");
        jPanel1.add(jLabel1);
        jLabel1.setBounds(20, 30, 70, 20);

        jLabel2.setText("Valor:");
        jPanel1.add(jLabel2);
        jLabel2.setBounds(50, 90, 28, 20);

        jLabel3.setText("Responsable:");
        jPanel1.add(jLabel3);
        jLabel3.setBounds(50, 120, 70, 20);

        jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        jPanel2.setLayout(null);

        jLabel4.setText("Deuda:");
        jPanel2.add(jLabel4);
        jLabel4.setBounds(10, 10, 50, 14);

        lbl_saldo.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        lbl_saldo.setForeground(new java.awt.Color(153, 0, 0));
        lbl_saldo.setText("0.00");
        jPanel2.add(lbl_saldo);
        lbl_saldo.setBounds(60, 40, 80, 30);

        jLabel6.setText("Pendiente:");
        jPanel2.add(jLabel6);
        jLabel6.setBounds(10, 34, 70, 20);

        lbl_valor.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        lbl_valor.setForeground(new java.awt.Color(0, 102, 102));
        lbl_valor.setText("0.00");
        jPanel2.add(lbl_valor);
        lbl_valor.setBounds(60, 10, 80, 30);

        jPanel1.add(jPanel2);
        jPanel2.setBounds(340, 30, 150, 80);

        bt_registrar.setText("Registrar");
        bt_registrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                bt_registrarActionPerformed(evt);
            }
        });
        jPanel1.add(bt_registrar);
        bt_registrar.setBounds(340, 120, 140, 40);

        txt_resp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txt_respActionPerformed(evt);
            }
        });
        jPanel1.add(txt_resp);
        txt_resp.setBounds(130, 120, 160, 20);

        jLabel8.setText("Fecha - Hora:");
        jPanel1.add(jLabel8);
        jLabel8.setBounds(50, 60, 110, 20);

        txt_fecha.setEditable(false);
        jPanel1.add(txt_fecha);
        txt_fecha.setBounds(130, 60, 80, 20);

        txt_hora.setEditable(false);
        jPanel1.add(txt_hora);
        txt_hora.setBounds(220, 60, 70, 20);

        jLabel5.setText(" -");
        jPanel1.add(jLabel5);
        jLabel5.setBounds(210, 60, 30, 20);

        txt_valor.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_valorKeyTyped(evt);
            }
        });
        jPanel1.add(txt_valor);
        txt_valor.setBounds(130, 90, 160, 20);

        txt_clave.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txt_claveKeyTyped(evt);
            }
        });
        jPanel1.add(txt_clave);
        txt_clave.setBounds(130, 150, 160, 20);

        jLabel7.setText("Cambiar Resp:");
        jPanel1.add(jLabel7);
        jLabel7.setBounds(50, 150, 70, 20);

        getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    public int numeroPago(){
    int numPago=0;    
        try{
            ResultSet r=conexion.consultarBase("select MAX(cod_pagos) from pagoscc where cod_cuentasCobrar="+cod_Cuenta+" and cod_cliente='"+cod_cliente+"' ;");
            r.next();
            int numero=r.getInt(1)+1;
            System.out.println("Numero Pago Generado: "+numero);
            numPago=numero;
        } catch(java.sql.SQLException e){};
        
    return numPago;    
    }
    
    public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = new BigDecimal(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}
    
    public void registrarPago(){
    // TODO add your handling code here:
    int cod_pago=numeroPago();
    int cod_cuenta=cod_Cuenta;
    String fecha_pag=txt_fecha.getText();
    String hora_pag=txt_hora.getText();
    double valor_pag=Double.parseDouble(txt_valor.getText().toString().replaceAll(",","."));
    String responsable=txt_resp.getText().toString();
    
    double deudaCant=Double.parseDouble(lbl_valor.getText().toString());
    double nuevo=deudaCant-valor_pag;    
    nuevo=round(nuevo, 2);
    
    if(nuevo>=0){
    
    conexion.insertarDatos("insert into pagoscc values("+cod_pago+","+cod_cuenta+",'"+cod_cliente+"','"+fecha_pag+"','"+hora_pag+"',"+valor_pag+",'"+responsable+"');");
    conexion.actualizarBase("update cuentaspendientes set valor="+nuevo+" where cod_cuentasCobrar="+cod_cuenta+" and cod_cliente like '"+cod_cliente+"';" );
    
    if(nuevo==0){
    ceroCuenta(cod_cuenta,cod_cliente);
    }
    
    //Actualizo saldo deudor del cliente:
    //Consulto todos los pagos y todas las cuentas:
    //Saco el total de cuentas pendientes:
    ResultSet re=conexion.consultarBase("SELECT sum(valor) FROM cuentaspendientes c where cod_cliente like '"+cod_cliente+"' and pagado like 'falta';");
    double valor=0;
    try {
        re.beforeFirst();
        re.next();
        valor=re.getDouble(1);
        valor =round(valor, 2);
    } catch (SQLException ex) {
        Logger.getLogger(Vent_RegAbonos.class.getName()).log(Level.SEVERE, null, ex);
    }
    
    conexion.actualizarBase("update cliente set saldo_deudor="+valor+" where cod_cliente like '"+cod_cliente+"';");
    }else{
    JOptionPane.showMessageDialog(this,"Se esta tratando de paga demas una cuenta , Intente con otra Factura.","Informacion",JOptionPane.INFORMATION_MESSAGE);
    }
    
        //Actualizo las Ventanas Relacionadas
        if (bandera.equals("xCobrar")) {
            //Registro el Asiento:
            asientoPagoxCobrar(String.valueOf(valor_pag));
            
            refrescar();
            vent_CC.refrescar();
            

        }
        if (bandera.equals("xPagar")) {
            
            //Registro el Asiento:
            asientoPagoxPagar(String.valueOf(valor_pag));
            
            refrescar();
            vent_CP.refrescar();
            vent_CP.vent_deudas.refrescar();
            
        }

    }
    
    public void ceroCuenta(int cod_Cuenta,String cod_Cliente){
    //Le pongo pagado en la cuenta si es el caso que se acabo de pagar:
        if(conexion.actualizarBaseResp("update cuentaspendientes set pagado='pagado' where cod_cuentasCobrar="+cod_Cuenta+" and cod_cliente like '"+cod_Cliente+"';")){
        
        }else{
        JOptionPane.showMessageDialog(this,"Hay un error al registrar la cuenta como PAGADA COMPLETAMENTE","Informacion",JOptionPane.INFORMATION_MESSAGE);
        }
    
    
    }
    //Cancelan cuentas por cobrar:
    public void asientoPagoxCobrar(String valor){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,fecha,"Se nos Paga CuentaxCobrar");
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","1","0",valor,"0");   //Asiento de Caja  debe
            asientoDeatlle(numeroAsiento,numeroDiario,"3","1","1","0","0",valor);   //Ctas x Cobrar
            
    }
    //Cancelan Cuentas por Pagar
    public void asientoPagoxPagar(String valor){
            String numeroDiario=numeroDiario();
            this.asiento(numeroDiario,fecha,"Por el Pago de CuentaxPagar");
            String numeroAsiento=numeroAsiento();
            asientoDeatlle(numeroAsiento,numeroDiario,"6","1","2","0",valor,"0");   //Ctasx Pagar
            asientoDeatlle(numeroAsiento,numeroDiario,"1","1","1","0","0",valor);   //Caja  debe
    }
    
    
    public String numeroDiario(){
         String numero=""; 
         try{
            java.sql.ResultSet r=conexion.consultarBase("select  cod_diario from diario where fecha_diario=(select max(fecha_diario) from diario) limit 1");
            r.next();
            numero=r.getString(1);
          }catch(SQLException f){}
         return numero;
    }
    
     public String numeroAsiento(){
         String numero=""; 
         try{
            java.sql.ResultSet r=conexion.consultarBase("select max(cod_asiento) from asiento");
            r.next();
            numero=r.getString(1);
          }catch(SQLException f){}
         return numero;
    }
    public void asiento(String numeroDiario,String fecha,String referencia){
        conexion.insertarDatos("insert into asiento(cod_diario,fecha_dia,referencia) values("+numeroDiario+",'"+fecha+"','"+referencia+"')");
    }
    public void asientoDeatlle(String numeroAsiento,String numeroDiario,String n3,String n2,String n1,String parcial,String debe,String haber){
        String consultaDtlAs= "insert into dtl_asiento "+
                              "(cod_diario,cod_asiento,cod_tercernivel,cod_segundonivel,cod_primernivel,parcial,debe,haber) " +
                              "values ("+numeroDiario+","+numeroAsiento+","+n3+","+n2+","+n1+","+parcial+","+debe+","+haber+")";
        conexion.insertarDatos(consultaDtlAs);
    }
    
private void bt_registrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_bt_registrarActionPerformed
//Valido la accion:
    String r=txt_resp.getText().toString().replaceAll(" ","");
    String v=txt_valor.getText().toString().replaceAll(" ","");
    System.out.println("Los valores de r:"+r+"Los valores de v:"+v);
    if(r.equals("")||v.equals("")){
       JOptionPane.showMessageDialog(this,"No se han completado los datos requeridos.","Informacion",JOptionPane.INFORMATION_MESSAGE);
    }else{
    registrarPago();
    }
    
}//GEN-LAST:event_bt_registrarActionPerformed

private void cb_facturaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cb_facturaActionPerformed
// TODO add your handling code here:
    try{
    int selecion=cb_factura.getSelectedIndex();
    Object item=cb_factura.getItemAt(selecion);
    String[] deuda=item.toString().split(" ");
    String valorDeuda=deuda[4];
    lbl_valor.setText(valorDeuda);
    lbl_saldo.setText("0");
    cod_Cuenta=Integer.parseInt(deuda[0].toString());
    }catch(Exception e){}
    
}//GEN-LAST:event_cb_facturaActionPerformed

private void txt_respActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txt_respActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_txt_respActionPerformed

private void txt_valorKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_valorKeyTyped
// TODO add your handling code here:
    // TODO add your handling code here:
    int presiona = evt.getKeyChar();
    if (presiona == 10) {
        double abono = 0;
        System.out.println("Abono es:" + txt_valor.getText());
        try {
            abono = Double.parseDouble(txt_valor.getText().toString());
        } catch (Exception e) {
        }
        System.out.println("Abono es:" + abono);
        double cantidad = Double.parseDouble(lbl_valor.getText().toString());
        double saldo = cantidad - abono;
        lbl_saldo.setText(String.valueOf(saldo));

    }
}//GEN-LAST:event_txt_valorKeyTyped

private void txt_claveKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_claveKeyTyped
// TODO add your handling code here:
     int presiona=evt.getKeyChar();
        if(presiona==10){
            String clave=txt_clave.getText();
            ResultSet resp=conexion.consultarBase("select * from usuario where clave='"+clave+"'");
            try {
                resp.beforeFirst();
                resp.next();
                String nombre=resp.getString(2);
                txt_resp.setText(nombre);
                
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(this,"Hay un error en la clave","Informacion",JOptionPane.INFORMATION_MESSAGE);
            }
            
        }
    txt_clave.setText("");
}//GEN-LAST:event_txt_claveKeyTyped

private void cb_facturaItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cb_facturaItemStateChanged
// TODO add your handling code here:
}//GEN-LAST:event_cb_facturaItemStateChanged


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton bt_registrar;
    private javax.swing.JComboBox cb_factura;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JLabel lbl_saldo;
    private javax.swing.JLabel lbl_valor;
    private javax.swing.JPasswordField txt_clave;
    private javax.swing.JTextField txt_fecha;
    private javax.swing.JTextField txt_hora;
    private javax.swing.JTextField txt_resp;
    private javax.swing.JTextField txt_valor;
    // End of variables declaration//GEN-END:variables

}
